package com.maint.g.utils

import android.content.Context
import android.media.AudioFormat
import android.media.AudioManager
import android.media.AudioTrack
import android.util.Log
import com.rokid.security.glass3.sdk.api.message.listener.IMessageListener

/**
 * 音频流管理器 - 处理音频流的接收和播放
 */
class AudioStreamManager(private val context: Context) {
    private val TAG = "AudioStreamManager"
    
    // 音频配置参数
    private val SAMPLE_RATE = 16000 // 采样率
    private val CHANNEL_CONFIG = AudioFormat.CHANNEL_OUT_MONO // 单声道
    private val AUDIO_FORMAT = AudioFormat.ENCODING_PCM_16BIT // 16位PCM编码
    private val BUFFER_SIZE = AudioTrack.getMinBufferSize(SAMPLE_RATE, CHANNEL_CONFIG, AUDIO_FORMAT) * 2
    
    private var audioTrack: AudioTrack? = null
    private var isInitialized = false
    
    /**
     * 初始化音频播放组件
     */
    fun initialize() {
        try {
            audioTrack = AudioTrack(
                AudioManager.STREAM_MUSIC,
                SAMPLE_RATE,
                CHANNEL_CONFIG,
                AUDIO_FORMAT,
                BUFFER_SIZE,
                AudioTrack.MODE_STREAM
            )
            isInitialized = true
            Log.d(TAG, "AudioTrack初始化成功")
        } catch (e: Exception) {
            Log.e(TAG, "AudioTrack初始化失败: ${e.message}")
        }
    }
    
    /**
     * 处理接收到的音频数据（ByteArray版本）
     * 注意：这个方法需要从正确的消息监听器中调用
     */
    fun processAudioData(audioData: ByteArray) {
        if (!isInitialized) {
            initialize()
        }
        
        try {
            if (audioTrack?.playState == AudioTrack.PLAYSTATE_PLAYING) {
                audioTrack?.write(audioData, 0, audioData.size)
                Log.d(TAG, "播放音频数据成功，大小: ${audioData.size} bytes")
            } else if (audioTrack?.playState == AudioTrack.PLAYSTATE_STOPPED) {
                audioTrack?.play()
                audioTrack?.write(audioData, 0, audioData.size)
                Log.d(TAG, "开始播放音频数据")
            }
        } catch (e: Exception) {
            Log.e(TAG, "播放音频数据失败: ${e.message}")
        }
    }
    
    /**
     * 处理接收到的音频数据（ByteBuffer版本）
     * 直接从ByteBuffer中读取数据并播放，确保音频流的实时性
     */
    fun processAudioData(buffer: java.nio.ByteBuffer) {
        if (!isInitialized) {
            initialize()
        }
        
        try {
            // 确保ByteBuffer处于正确的读取位置
            val position = buffer.position()
            val limit = buffer.limit()
            val size = limit - position
            
            Log.d(TAG, "收到ByteBuffer音频数据，大小: $size bytes")
            
            if (size > 0) {
                // 创建临时ByteArray来存储数据
                val audioData = ByteArray(size)
                buffer.get(audioData)
                
                // 将buffer的位置重置，以便其他地方可以重新读取
                buffer.position(position)
                
                // 调用现有的ByteArray处理方法
                processAudioData(audioData)
            } else {
                Log.w(TAG, "收到空的音频数据")
            }
        } catch (e: Exception) {
            Log.e(TAG, "处理ByteBuffer音频数据失败: ${e.message}")
        }
    }
    
    /**
     * 停止播放
     */
    fun stop() {
        try {
            audioTrack?.stop()
            Log.d(TAG, "音频播放已停止")
        } catch (e: Exception) {
            Log.e(TAG, "停止音频播放失败: ${e.message}")
        }
    }
    
    /**
     * 释放资源
     */
    fun release() {
        try {
            audioTrack?.stop()
            audioTrack?.release()
            audioTrack = null
            isInitialized = false
            Log.d(TAG, "AudioTrack资源已释放")
        } catch (e: Exception) {
            Log.e(TAG, "释放AudioTrack资源失败: ${e.message}")
        }
    }
    
    /**
     * 创建一个音频消息处理器，可以集成到现有的消息监听器中
     * 注意：根据实际SDK接口调整处理逻辑
     */
    fun createAudioMessageHandler(): AudioMessageHandler {
        return AudioMessageHandler(this)
    }
    
    /**
     * 音频消息处理器 - 用于集成到IMessageListener中
     */
    class AudioMessageHandler(private val manager: AudioStreamManager) {
        /**
         * 处理可能的音频数据消息
         * 注意：这里是一个示例，需要根据实际SDK的消息格式调整
         * 可能需要解析文本消息中的特殊格式来获取音频数据
         */
        fun handlePotentialAudioMessage(message: String) {
            // 示例：检查消息是否包含特殊的音频数据标记
            // 实际实现需要根据mobile-app的发送格式来确定
            if (message.startsWith("AUDIO_DATA:")) {
                try {
                    // 这里只是示例，实际需要根据mobile-app的编码方式来解码
                    Log.d(manager.TAG, "检测到可能的音频数据消息")
                    // 实际项目中需要实现正确的解码逻辑
                } catch (e: Exception) {
                    Log.e(manager.TAG, "解析音频消息失败: ${e.message}")
                }
            }
        }
    }
}